package com.fanshuai.algorithms.divide;

public class YinshiFenJie {
    /**
     * 是否为素数
     * @param a
     * @return
     */
    public static boolean suShu(int a) {
        int sqrt = (int) Math.sqrt(a);

        for (int i = 2; i <= sqrt; i++) {
            if (a % i == 0) {
                return false;
            }
        }

        return true;
    }

    /**
     * 因式分解
     * @param a
     * @return
     */
    public static String yinShiFenjie(int a) {
        StringBuilder b = new StringBuilder();
        for (int i = 2; i <= a; i++) {
            int k = i;
            if (suShu(k)) {
                while (a % k == 0) {
                    b.append("*").append(k);
                    a /= k;
                }
            }
        }

        String s = b.toString();
        return s.substring(1);
    }

    /**
     * 大于1 的正整数n 可以分解为：n=x1 *x 2*…*xm 。                            
     例如，当n= 12 时，共有8 种不同的分解式： 
     12= 12； 
     12=6*2； 
     12=4*3； 
     12=3*4； 
     12=3*2*2； 
     12=2*6； 
     12=2*3*2； 
     12=2*2*3。 
     编程任务： 
     对于给定的正整数n，编程计算n 共有多少种不同的分解式。 
     数据输入： 
     输入数据第一行有1 个正整数n (1≤n≤2000000000) 。 
     结果输出: 
     将计算出的不同的分解式数。
     * @param a
     * @return
     */
    public static int solve(int a) {
        if (a == 1) {
            return 1;
        }
        int count = 0;

        for (int i = 2; i <= a; i++) {
            if (a % i == 0) {
                count += solve(a / i);
            }
        }
        return count;
    }

    public static void main(String[] args) {
        int[] a = {2, 3, 4, 5, 6, 7, 8, 9, 11};
        for (int i : a) {
            System.out.println(suShu(i));
        }

        int[] a2 = {100, 200, 256, 1020, 729, 8181, 1200};
        for (int i : a2) {
            System.out.println(yinShiFenjie(i));
        }

        System.out.println(solve(12));
    }
}
